🎵 Audio Processing: Spectrograms & MFCC

📅 Январь 2026

🔷 1. Основы аудио

🔷 2. Загрузка аудио

import librosa
import numpy as np
import matplotlib.pyplot as plt

# Загрузка аудиофайла
audio, sr = librosa.load('audio.wav', sr=22050)

# Информация
print(f"Sample rate: {sr} Hz")
print(f"Длительность: {len(audio)/sr:.2f} сек")
print(f"Shape: {audio.shape}")

# Визуализация waveform
plt.figure(figsize=(12, 4))
librosa.display.waveshow(audio, sr=sr)
plt.title('Waveform')
plt.xlabel('Время (с)')
plt.ylabel('Амплитуда')

    

🔷 3. Spectrogram (Спектрограмма)

Идея: визуализация частотного содержания во времени

  • Ось X: время
  • Ось Y: частота
  • Цвет/Яркость: интенсивность (амплитуда/мощность)
  • Метод: STFT (Short-Time Fourier Transform)
# Вычисление спектрограммы
D = librosa.stft(audio, n_fft=2048, hop_length=512)
magnitude = np.abs(D)
power = magnitude**2

# Преобразование в дБ
spectrogram_db = librosa.amplitude_to_db(magnitude, ref=np.max)

# Визуализация
plt.figure(figsize=(12, 4))
librosa.display.specshow(
    spectrogram_db,
    sr=sr,
    hop_length=512,
    x_axis='time',
    y_axis='hz'
)
plt.colorbar(format='%+2.0f dB')
plt.title('Спектрограмма')

🔷 4. Mel-Spectrogram

Mel-шкала: шкала частот, близкая к восприятию человека

  • Нелинейная шкала частот
  • Больше деталей на низких частотах
  • Меньше на высоких (где слух менее чувствителен)
  • Стандарт для распознавания речи
# Mel-спектрограмма
mel_spec = librosa.feature.melspectrogram(
    y=audio,
    sr=sr,
    n_fft=2048,
    hop_length=512,
    n_mels=128,  # количество mel-полос
    fmax=8000    # максимальная частота
)

# В дБ
mel_spec_db = librosa.power_to_db(mel_spec, ref=np.max)

# Визуализация
plt.figure(figsize=(12, 4))
librosa.display.specshow(
    mel_spec_db,
    sr=sr,
    hop_length=512,
    x_axis='time',
    y_axis='mel'
)
plt.colorbar(format='%+2.0f dB')
plt.title('Mel-Спектрограмма')

🔷 5. MFCC (Mel-Frequency Cepstral Coefficients)

Цель: компактное представление спектра звука

  • Шаги:
    1. Вычислить mel-спектрограмму
    2. Взять логарифм
    3. Применить DCT (Discrete Cosine Transform)
    4. Взять первые N коэффициентов
  • Обычно: 13-40 коэффициентов
  • Первый коэффициент: средняя энергия (часто удаляют)
# Вычисление MFCC
mfccs = librosa.feature.mfcc(
    y=audio,
    sr=sr,
    n_mfcc=13,     # количество коэффициентов
    n_fft=2048,
    hop_length=512
)

# Визуализация
plt.figure(figsize=(12, 4))
librosa.display.specshow(
    mfccs,
    sr=sr,
    hop_length=512,
    x_axis='time'
)
plt.colorbar()
plt.title('MFCC')
plt.ylabel('MFCC коэффициенты')
plt.show()

# Статистики для ML
mfcc_mean = np.mean(mfccs, axis=1)
mfcc_std = np.std(mfccs, axis=1)
features = np.concatenate([mfcc_mean, mfcc_std])
MFCC коэффициенты

🔷 6. Дополнительные признаки

ПризнакОписаниеПрименение
Zero Crossing RateЧастота смены знакаШумы vs музыка
Spectral CentroidЦентр масс спектраЯркость звука
Spectral RolloffЧастота ниже которой 85% энергииТембр
Chroma12 pitch classesМузыкальный анализ
TempoТемп в BPMРитм
# Zero Crossing Rate
zcr = librosa.feature.zero_crossing_rate(audio)

# Spectral Centroid
spec_cent = librosa.feature.spectral_centroid(y=audio, sr=sr)

# Spectral Rolloff
spec_rolloff = librosa.feature.spectral_rolloff(y=audio, sr=sr)

# Chroma features
chroma = librosa.feature.chroma_stft(y=audio, sr=sr)

# Tempo
tempo, beats = librosa.beat.beat_track(y=audio, sr=sr)

print(f"Tempo: {tempo:.2f} BPM")
Дополнительные признаки во времени

🔷 7. Предобработка аудио

# Удаление тишины
audio_trimmed, index = librosa.effects.trim(
    audio, 
    top_db=20  # порог в дБ
)

# Нормализация
audio_norm = librosa.util.normalize(audio)

# Изменение sample rate
audio_resampled = librosa.resample(
    audio, 
    orig_sr=sr, 
    target_sr=16000
)

# Добавление шума (augmentation)
noise = np.random.randn(len(audio))
audio_noisy = audio + 0.005 * noise

# Изменение высоты тона
audio_pitched = librosa.effects.pitch_shift(
    audio, 
    sr=sr, 
    n_steps=2  # полутона
)

# Изменение скорости
audio_stretched = librosa.effects.time_stretch(
    audio, 
    rate=1.2  # в 1.2 раза быстрее
)

🔷 8. Извлечение признаков для ML

def extract_features(audio_path):
    """Извлечь все признаки из аудио"""
    # Загрузка
    audio, sr = librosa.load(audio_path, sr=22050)
    
    # MFCC
    mfccs = librosa.feature.mfcc(y=audio, sr=sr, n_mfcc=13)
    mfcc_mean = np.mean(mfccs, axis=1)
    mfcc_std = np.std(mfccs, axis=1)
    
    # Spectral features
    spec_cent = librosa.feature.spectral_centroid(y=audio, sr=sr)
    spec_cent_mean = np.mean(spec_cent)
    
    zcr = librosa.feature.zero_crossing_rate(audio)
    zcr_mean = np.mean(zcr)
    
    # Chroma
    chroma = librosa.feature.chroma_stft(y=audio, sr=sr)
    chroma_mean = np.mean(chroma, axis=1)
    
    # Объединение всех признаков
    features = np.concatenate([
        mfcc_mean,
        mfcc_std,
        [spec_cent_mean],
        [zcr_mean],
        chroma_mean
    ])
    
    return features

# Использование
features = extract_features('audio.wav')
print(f"Feature vector shape: {features.shape}")

🔷 9. Data Augmentation

  • Добавление шума: white noise, background noise
  • Pitch shifting: изменение высоты тона
  • Time stretching: изменение скорости
  • Time shifting: сдвиг во времени
  • Dynamic range compression: нормализация громкости
import audiomentations as A

# Библиотека для аугментации
augmenter = A.Compose([
    A.AddGaussianNoise(min_amplitude=0.001, max_amplitude=0.015, p=0.5),
    A.TimeStretch(min_rate=0.8, max_rate=1.2, p=0.5),
    A.PitchShift(min_semitones=-4, max_semitones=4, p=0.5),
    A.Shift(min_fraction=-0.5, max_fraction=0.5, p=0.5),
])

# Применение
augmented_audio = augmenter(samples=audio, sample_rate=sr)

🔷 10. Применения

✅ Распознавание речи (ASR)

  • MFCC + RNN/Transformer
  • Mel-спектрограмма + CNN
  • wav2vec 2.0, Whisper

✅ Классификация звуков

  • Музыкальные жанры
  • Эмоции в речи
  • Детекция событий (сирена, выстрел)

✅ Синтез речи (TTS)

  • Mel-спектрограмма → Vocoder
  • Tacotron 2, FastSpeech

✅ Музыкальный анализ

  • Определение темпа, тональности
  • Source separation

🔷 11. Параметры STFT

ПараметрОписаниеТипичные значения
n_fftРазмер окна FFT512, 1024, 2048
hop_lengthШаг окнаn_fft/4 (512)
win_lengthДлина окна= n_fft
windowОконная функция'hann' (по умолч.)

Частотное разрешение: sr / n_fft

Временное разрешение: hop_length / sr

Компромисс: большое n_fft → лучше частотное разрешение, но хуже временное

🔷 12. PyTorch/TensorFlow пайплайн

import torch
import torchaudio
import torchaudio.transforms as T

# Загрузка
waveform, sample_rate = torchaudio.load('audio.wav')

# Mel-спектрограмма трансформация
mel_transform = T.MelSpectrogram(
    sample_rate=sample_rate,
    n_fft=2048,
    hop_length=512,
    n_mels=128
)

# Применение
mel_spec = mel_transform(waveform)

# В дБ
power_to_db = T.AmplitudeToDB()
mel_spec_db = power_to_db(mel_spec)

# MFCC трансформация
mfcc_transform = T.MFCC(
    sample_rate=sample_rate,
    n_mfcc=13,
    melkwargs={
        'n_fft': 2048,
        'hop_length': 512,
        'n_mels': 128
    }
)

mfcc = mfcc_transform(waveform)

print(f"Mel-spec shape: {mel_spec.shape}")
print(f"MFCC shape: {mfcc.shape}")

🔷 13. Чек-лист

  • [ ] Выбрать sample rate: 16 kHz для речи, 22-44 kHz для музыки
  • [ ] Предобработка: удалить тишину, нормализовать
  • [ ] Выбрать представление: MFCC (компактно), Mel-spec (для DL)
  • [ ] Настроить параметры: n_fft, hop_length
  • [ ] Аугментация: шум, pitch shift, time stretch
  • [ ] Извлечь статистики: mean, std для MFCC
  • [ ] Визуализировать: проверить качество данных

💡 Объяснение заказчику:

«Спектрограмма — это как "фотография" звука, показывающая какие частоты присутствуют в каждый момент времени. MFCC — это компактный набор чисел, описывающих характеристики звука, который хорошо подходит для распознавания речи и музыки».
Mel-Спектрограмма - mel-шкала частотСравнение линейной и mel-шкалы частотСпектрограмма - частоты во времениWaveform - форма звуковой волны